# rtasr_connection_test.py - 语音识别连接测试和修复
import hashlib
import hmac
import base64
import time
from urllib.parse import quote
import requests

# 从config导入配置
try:
    from config import RTASR_APPID, RTASR_APIKey

    print(f"✅ 配置加载成功:")
    print(f"   RTASR_APPID: {RTASR_APPID}")
    print(f"   RTASR_APIKey: {RTASR_APIKey[:10]}...{RTASR_APIKey[-5:]}")
except ImportError as e:
    print(f"❌ 配置加载失败: {e}")
    exit(1)


def test_websocket_import():
    """测试WebSocket模块"""
    try:
        import websocket
        print("✅ WebSocket模块导入成功")
        print(f"   版本: {websocket.__version__ if hasattr(websocket, '__version__') else '未知'}")
        return True
    except ImportError:
        print("❌ WebSocket模块未安装")
        print("   解决方案: pip install websocket-client")
        return False


def test_api_credentials():
    """测试API凭据"""
    if not RTASR_APPID or RTASR_APPID == 'your_rtasr_appid':
        print("❌ RTASR_APPID未配置或使用默认值")
        return False

    if not RTASR_APIKey or RTASR_APIKey == 'your_rtasr_api_key':
        print("❌ RTASR_APIKey未配置或使用默认值")
        return False

    print("✅ API凭据配置正确")
    return True


def test_websocket_url():
    """测试WebSocket URL生成"""
    try:
        ts = str(int(time.time()))
        base_string = hashlib.md5((RTASR_APPID + ts).encode()).hexdigest()
        signa = hmac.new(RTASR_APIKey.encode(), base_string.encode(), hashlib.sha1).digest()
        signa = base64.b64encode(signa).decode()

        url = f"wss://rtasr.xfyun.cn/v1/ws?appid={RTASR_APPID}&ts={ts}&signa={quote(signa)}"
        print("✅ WebSocket URL生成成功")
        print(f"   URL: {url[:80]}...")
        return url
    except Exception as e:
        print(f"❌ WebSocket URL生成失败: {e}")
        return None


def test_network_connectivity():
    """测试网络连接"""
    try:
        print("🌐 测试网络连接...")
        response = requests.get('https://rtasr.xfyun.cn', timeout=10)
        print(f"✅ 讯飞服务器可达，状态码: {response.status_code}")
        return True
    except requests.exceptions.Timeout:
        print("❌ 连接超时，请检查网络")
        return False
    except requests.exceptions.ConnectionError:
        print("❌ 连接失败，请检查网络或防火墙")
        return False
    except Exception as e:
        print(f"❌ 网络测试失败: {e}")
        return False


def test_websocket_connection():
    """测试WebSocket连接"""
    if not test_websocket_import():
        return False

    url = test_websocket_url()
    if not url:
        return False

    try:
        import websocket
        print("🔌 尝试WebSocket连接...")

        ws = websocket.create_connection(url, timeout=10)
        print("✅ WebSocket连接成功")

        ws.close()
        print("✅ WebSocket连接已关闭")
        return True

    except Exception as e:
        print(f"❌ WebSocket连接失败: {e}")

        # 提供详细的错误分析
        error_str = str(e)
        if "timeout" in error_str.lower():
            print("   原因可能：网络超时")
            print("   建议：检查网络连接或使用VPN")
        elif "certificate" in error_str.lower():
            print("   原因可能：SSL证书问题")
            print("   建议：检查系统时间或网络设置")
        elif "403" in error_str or "401" in error_str:
            print("   原因可能：API密钥错误")
            print("   建议：检查config.py中的RTASR配置")
        else:
            print("   原因未知，建议联系技术支持")

        return False


def main():
    """主测试函数"""
    print("🔧 讯飞语音识别连接诊断")
    print("=" * 50)

    # 1. 测试配置
    if not test_api_credentials():
        print("\n💡 解决方案：")
        print("   1. 检查config.py文件")
        print("   2. 确保RTASR_APPID和RTASR_APIKey已正确配置")
        print("   3. 重新从讯飞开放平台获取密钥")
        return False

    # 2. 测试网络
    if not test_network_connectivity():
        print("\n💡 解决方案：")
        print("   1. 检查网络连接")
        print("   2. 尝试关闭VPN或代理")
        print("   3. 检查防火墙设置")
        return False

    # 3. 测试WebSocket
    if not test_websocket_connection():
        print("\n💡 解决方案：")
        print("   1. 安装websocket-client: pip install websocket-client")
        print("   2. 检查API密钥是否有效")
        print("   3. 尝试重启网络连接")
        return False

    print("\n🎉 所有测试通过！语音识别应该可以正常工作")
    return True


if __name__ == "__main__":
    main()